From: Giovanni Campagna Date: Sun, 28 Oct 2012 11:26:21 +0000 (+0100) Subject: ScreenShield: don't rely on gnome-session to hide the lightbox X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~5490 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=1c3e7330f368e1574d71df6b137677a295eb740d;p=gnome-shell.git ScreenShield: don't rely on gnome-session to hide the lightbox If we lock before the user becomes active again, gnome-session will never change presence from IDLE, and thus we'll never hide the lightbox. Instead, install our own idle monitor. https://bugzilla.gnome.org/show_bug.cgi?id=687020 --- diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js index 52c7dcc75..6dcd188fa 100644 --- a/js/ui/screenShield.js +++ b/js/ui/screenShield.js @@ -436,6 +436,8 @@ const ScreenShield = new Lang.Class({ { inhibitEvents: true, fadeInTime: STANDARD_FADE_TIME, fadeFactor: 1 }); + + this.idleMonitor = new GnomeDesktop.IdleMonitor(); }, _onLockScreenKeyRelease: function(actor, event) { @@ -545,35 +547,43 @@ const ScreenShield = new Lang.Class({ }, _onStatusChanged: function(status) { - if (status == GnomeSession.PresenceStatus.IDLE) { - if (this._dialog) { - this._dialog.cancel(); - if (!this._isGreeter) { - this._dialog = null; - } - } + if (status != GnomeSession.PresenceStatus.IDLE) + return; - if (!this._isModal) { - Main.pushModal(this.actor); - this._isModal = true; + if (this._dialog) { + this._dialog.cancel(); + if (!this._isGreeter) { + this._dialog = null; } + } - if (!this._isActive) { - this._lightbox.show(); + if (!this._isModal) { + Main.pushModal(this.actor); + this._isModal = true; + } - if (this._activationTime == 0) - this._activationTime = GLib.get_monotonic_time(); - } - } else { - let lightboxWasShown = this._lightbox.shown; - this._lightbox.hide(); + if (!this._isActive) { + this._lightbox.show(); - let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY); - if (shouldLock || this._isActive) { - this.lock(false); - } else if (this._isModal) { - this.unlock(); - } + if (this._activationTime == 0) + this._activationTime = GLib.get_monotonic_time(); + + this._becameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, function() { + this.idleMonitor.disconnect(this._becameActiveId); + + let lightboxWasShown = this._lightbox.shown; + this._lightbox.hide(); + + let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY); + if (shouldLock || this._isLocked) { + this.lock(false); + } else if (this._isActive) { + this.unlock(); + } + })); + + this._isActive = true; + this.emit('lock-status-changed'); } }, @@ -830,6 +840,7 @@ const ScreenShield = new Lang.Class({ this._activationTime = 0; this._isActive = false; + this._isLocked = false; this.emit('lock-status-changed'); }, @@ -854,6 +865,7 @@ const ScreenShield = new Lang.Class({ this._resetLockScreen(animate, animate); this._isActive = true; + this._isLocked = true; this.emit('lock-status-changed'); }, });